import Ejemplos
import Control.Monad
import System.IO

main = do
        hSetBuffering stdout NoBuffering
        putStr mostrarMenu
        forever correrEjemplo

correrEjemplo :: IO ()
correrEjemplo = do
        putStr mostrarEjemplos
        opcion <- obtenerOpcion
        ejemplos !! opcion
        putStr "ENTER para continuar"
        getLine
        return ()

obtenerOpcion :: IO (Int)
obtenerOpcion = do
        putStr "Numero de ejemplo a correr: "
        n <- obtenerNumero
        if (n-1 < length ejemplos)
        then return (n-1)
        else do
            putStrLn ("El numero de ejemplo debe estar entre 1 y " ++ show (length ejemplos))
            obtenerOpcion

obtenerNumero :: IO (Int)
obtenerNumero = do
                numero <- getLine
                case filter (\(_,s) -> s == "") (reads numero :: [(Int, String)]) of
                    [] -> do
                        putStr "El numero es incorrecto. Intente de nuevo: "
                        obtenerNumero
                    (n, _) : _ ->
                        return n

mostrarMenu :: String
mostrarMenu = "----------------------------------\n"
           ++ "   TP1 PLP 1° Cuatrimestre 2013   \n"
           ++ "----------------------------------\n\n"

mostrarEjemplos :: String
mostrarEjemplos = "Elija el ejemplo a correr\n"
           ++ "\tfAst:\n"
           ++ "\t    1) Usando acumularAes con \"cazaa33343aaaaaa3333z3\"\n"
           ++ "\t    2) Usando acumularAes con \"cazaa33343aaaaaa3333z3aaa\"\n"
           ++ "\tgAst:\n"
           ++ "\t    3) Aplicando espejarEntreAes con \"123a456aa789a\"\n"
           ++ "\t    4) Aplicando espejarEntreAes con \"aa542a3333aa4567aa\"\n"
           ++ "\t    5) Aplicando espejarEntreAes con \"aaaaaa\"\n"
           ++ "\t    6) Aplicando cambiarAE con \"aa542a3333aa4567aa\" ++ (repeat 'a')\n"
           ++ "\t    7) Aplicando acumularAes con \"cazaa33343aaaaaa3333z3aaa\"\n"
           ++ "\t    8) Aplicando cambiarGatoPorLiebre con \"Tengo 1 gato, 2 gatos, 3 gatos\"\n"
           ++ "\t    9) Aplicando cambiarGatoPorLiebre con \"gata y gato no son lo mismo\"\n"
           ++ "\t    10) Aplicando intercambiarConsecutivos con \"123456\"\n"
           ++ "\t    11) Aplicando intercambiarConsecutivos con \"Intercambiando Todo\"\n"
           ++ "\tcomp:\n"
           ++ "\t    12) Usando espejarEntreAes seguido de espejarEntreAes con \"12223a234234a\"\n"
           ++ "\t    13) Usando acumularAes seguido de espejarEntreAes con \"122223a23423aa7a\"\n"
           ++ "\tsalidaAes:\n"
           ++ "\t    14) Usando cambiarAE\n"
           ++ "\tespejarEntreAes:\n"
           ++ "\t    15) Aplicando espejarEntreAes con \"1234a123444a3444a\"\n"
           ++ "\t    16) Aplicando espejarEntreAes con \"aa545a3333aa4567aa\"\n"
           ++ "\t    17) Aplicando espejarEntreAes con \"aaaaaa\"\n"
           ++ "\tsalidaPosible:\n"
           ++ "\t    18) Usando intercambiarConsecutivos con \"11\"\n"
           ++ "\t    19) Usando intercambiarConsecutivos con \"1134\"\n"
           ++ "\t    20) Usando intercambiarConsecutivos con \"113a\"\n"
           ++ "\t    21) Usando intercambiarConsecutivos con \"4437\"\n"
           ++ "\t    22) Usando mapearNumerosALetras con \"caja\"\n"
           ++ "\t    23) Usando mapearNumerosALetras con \"zorro\"\n"
           ++ "\t    24) Usando cambiarAES \"aaa\"\n"
           ++ "\t    25) Usando cambiarAES \"111\"\n"

ejemplos :: [IO ()]
ejemplos = ejemplosFAst
        ++ ejemplosGAst
        ++ ejemplosComp
        ++ ejemplosSalidaAes
        ++ ejemplosEspejarEntreAes
        ++ ejemplosSalidaPosible

ejemplosFAst :: [IO ()]
ejemplosFAst = [do
                    putStrLn "\tfAst acumularAes con \"cazaa33343aaaaaa3333z3\":"
                    putStrLn ("\t-> " ++ (show fAstEjemplo1))
                    return (),
                do
                    putStrLn "\tfAst acumularAes con \"cazaa33343aaaaaa3333z3aaa\":"
                    putStrLn ("\t-> " ++ (show fAstEjemplo2))
                    return ()
                ]

ejemplosGAst :: [IO ()]
ejemplosGAst = [do
                    putStrLn "\taplicando espejarEntreAes \"123a456aa789a\":"
                    putStrLn ("\t-> " ++ (show gAstEspejarEntreAesEj1))
                    return (),
                do
                    putStrLn "\taplicando espejarEntreAes \"aa542a3333aa4567aa\":"
                    putStrLn ("\t-> " ++ (show gAstEspejarEntreAesEj2))
                    return (),
                do
                    putStrLn "\taplicando espejarEntreAes \"aaaaaa\":"
                    putStrLn ("\t-> " ++ (show gAstEspejarEntreAesEj3))
                    return (),
                do
                    putStr  (   "\tProvea un numero para hacer 'take n (aplicando "
                            ++  "cambiarAE (\"aa542a3333aa4567aa\" ++ (repeat 'a')))': ")
                    n <- obtenerNumero
                    putStrLn ("\t-> " ++ (show (take n gAstEspejarEntreAesEjInf)))
                    return (),
                do
                    putStrLn "\taplicando acumularAes \"cazaa33343aaaaaa3333z3aaa\":"
                    putStrLn ("\t-> " ++ (show gAstAcumularAesEj1))
                    return (),
                do
                    putStrLn "\taplicando cambiarGatoPorLiebre \"Tengo 1 gato, 2 gatos, 3 gatos\":"
                    putStrLn ("\t-> " ++ (show gAstCambiarGatoPorLiebreEj1))
                    return (),
                do
                    putStrLn "\taplicando cambiarGatoPorLiebre \"gata y gato no son lo mismo\":"
                    putStrLn ("\t-> " ++ (show gAstCambiarGatoPorLiebreEj2))
                    return (),
                do
                    putStrLn "\taplicando intercambiarConsecutivos \"123456\":"
                    putStrLn ("\t-> " ++ (show gAstIntercambiarConsecutivosEj1))
                    return (),
                do
                    putStrLn "\taplicando intercambiarConsecutivos \"Intercambiando Todo\":"
                    putStrLn ("\t-> " ++ (show gAstIntercambiarConsecutivosEj2))
                    return ()
                ]

ejemplosComp :: [IO ()]
ejemplosComp = [do
                    putStrLn "\taplicando (comp espejarEntreAes espejarEntreAes) \"12223a234234a\":"
                    putStrLn ("\t-> " ++ (show compEjemplo1))
                    return (),
                do
                    putStrLn "\taplicando (comp acumularAes espejarEntreAes) \"122223a23423aa7a\":"
                    putStrLn ("\t-> " ++ (show compEjemplo2))
                    return ()
                ]

ejemplosSalidaAes :: [IO ()]
ejemplosSalidaAes = [do
                    putStr  "\tProvea un numero para hacer 'take n (salidaAes cambiarAE)': "
                    n <- obtenerNumero
                    putStrLn ("\t-> " ++ (show (take n salidaAesEjemplo1)))
                    return ()]

ejemplosEspejarEntreAes :: [IO ()]
ejemplosEspejarEntreAes = [ do
                                putStrLn "\taplicando espejarEntreAes \"1234a123444a3444a\":"
                                putStrLn ("\t-> " ++ (show espejarEntreAesEjemplo1))
                                return (),
                            do
                                putStrLn "\taplicando espejarEntreAes \"aa545a3333aa4567aa\":"
                                putStrLn ("\t-> " ++ (show espejarEntreAesEjemplo2))
                                return (),
                            do
                                putStrLn "\taplicando espejarEntreAes \"aaaaaa\":"
                                putStrLn ("\t-> " ++ (show espejarEntreAesEjemplo3))
                                return ()
                            ]

ejemplosSalidaPosible :: [IO ()]
ejemplosSalidaPosible = [   do
                                putStrLn "\tsalidaPosible intercambiarConsecutivos \"11\":"
                                putStrLn ("\t-> " ++ (show salidaPosibleEjemplo1))
                                return (),
                            do
                                putStrLn "\tsalidaPosible intercambiarConsecutivos \"1134\":"
                                putStrLn ("\t-> " ++ (show salidaPosibleEjemplo2))
                                return (),
                            do
                                putStrLn "\tsalidaPosible intercambiarConsecutivos \"113a\":"
                                putStrLn ("\t-> " ++ (show salidaPosibleEjemplo3))
                                return (),
                            do
                                putStrLn "\tsalidaPosible intercambiarConsecutivos \"4437\":"
                                putStrLn ("\t-> " ++ (show salidaPosibleEjemplo4))
                                return (),
                            do
                                putStrLn "\tsalidaPosible mapearNumerosALetras \"caja\":"
                                putStrLn ("\t-> " ++ (show salidaPosibleEjemplo5))
                                return (),
                            do
                                putStrLn "\tsalidaPosible mapearNumerosALetras \"zorro\":"
                                putStrLn ("\t-> " ++ (show salidaPosibleEjemplo6))
                                return (),
                            do
                                putStrLn "\tsalidaPosible cambiarAE \"aaa\":"
                                putStrLn ("\t-> " ++ (show salidaPosibleEjemplo7))
                                return (),
                            do
                                putStrLn "\tsalidaPosible cambiarAE \"111\":"
                                putStrLn ("\t-> " ++ (show salidaPosibleEjemplo8))
                                return ()
                        ]

